// // const obj = {}
// // const arr = []
// // for (let i = 0; i < 1000000; i++) {
// //   obj[`${i}`] = i
// //   arr[i] = i
// // }
//
// // const d1 = +new Date()
// // for (const key in obj) {
// //   obj[key] = key
// // }
// // const d2 = +new Date()
//
// // for (let i = 0; i < arr.length; i++) {
// //   arr[i] = i
// // }
// // const d3 = +new Date()
//
// //
// //
// // const arr = []
// // arr[3] = 3
// //
// const crypto = require('crypto-browserify')
// const p = crypto.getDiffieHellman('modp2')
// const p2 = crypto.getDiffieHellman('modp2')
//
// p.generateKeys()
// p2.generateKeys()
//
// const pubKey = p.getPublicKey()
// const pubKey2 = p2.getPublicKey()
//
// const secretKey = p.computeSecret(pubKey2).toString('hex')
// const secretKey2 = p2.computeSecret(pubKey).toString('hex')
//
//
//
//
// // function str2ab (str) {
// //   const buf = new ArrayBuffer(str.length * 2)
// //   const bufView = new Uint16Array(buf)
// //   for (let i = 0, strLen = str.length; i < strLen; i++) {
// //     bufView[i] = str.charCodeAt(i)
// //   }
// //   const uint32 = new Uint32Array(buf)
// //   return uint32
// // }
//
// //
//
// // function str2ab (str) {
// //   var bufView = new Uint8Array(str.length)
// //   for (var i = 0, strLen = str.length; i < strLen; i++) {
// //     bufView[i] = str.charCodeAt(i)
// //   }
// //   return bufView
// // }
// //
// //
// //
// // function uint32ToUint8 (num) {
// //   const
// // }
// let num = 255255
// num = num.toString(16)
//
//
//
//

// const objArr = [
//   {
//     res: null,
//     fn () {
//       this.res = 1
//     }
//   },
//   {
//     fn () {
//
//     }
//   }
// ]
// //
// objArr[1].fn()
//

import md5 from 'js-md5'
import { JSEncrypt } from 'jsencrypt'
import aesjs from 'aes-js'
import { Base64 } from 'js-base64'

const filter = (str) => {
  str += ''
  str = str.replace(/\+/g, '-')
  str = str.replace(/\//g, '_')
  return str
}

const clientID = '5604c7f1ed9bd5f61753774e6440ce1c'
// 生成16字节摘要 step1-end
const md5ClientID = md5.arrayBuffer(clientID)

const RSAsecret = new JSEncrypt({
  default_key_size: 1024
})
RSAsecret.setPublicKey(`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiKymEZa/oc0n3XiyILFE6qDM7
/6b7SEHvd5CkNQfJBq6+aihjvxuBZLKUDffJiekTaaVl6TlzQn+QNSw61tTPXo2m
eaMeTSVke98zUnbwlE/P7KVL6mzrvgI/MKRCGBP9WrH3/RS6TEM/6BvEl65yNLMs
dbRDUhXqm2ifaigdmQIDAQAB
-----END PUBLIC KEY-----`)

const encryptID = filter(RSAsecret.encrypt(md5ClientID))
// step2-end

// step3-end
const expert = 16
let str = Math.random().toString(36).substr(2)
while (str.length < expert) {
  str += Math.random().toString(36).substr(2)
}
const aesKey = str.substr(0, 16)

// aes-js加密
export const aesEncrypt = (content, key) => {
  let keyBytes
  if (typeof key === 'string') {
    keyBytes = aesjs.utils.utf8.toBytes(key)
  } else {
    keyBytes = key
  }
  const aesEcb = new aesjs.ModeOfOperation.Ecb(keyBytes)
  if (typeof content === 'string') {
    content = aesjs.utils.utf8.toBytes(content)
  }
  const times = (Math.floor(content.length / 16) + 1) * 16 - content.length
  const barray = new Uint8Array((Math.floor(content.length / 16) + 1) * 16)
  for (let i = 0; i < barray.length; i++) {
    if (content[i] || content[i] === 0) {
      barray[i] = content[i]
    } else {
      barray[i] = times
    }
  }
  const encryptedBytes = aesEcb.encrypt(barray)
  return encryptedBytes
}

const aesClientID = aesEncrypt(clientID, aesKey)

const base64AesClientID = filter(Base64.encode(aesClientID))
// step4-end

const aesKeyBytes = aesjs.utils.utf8.toBytes(aesKey)

const rsaAesKeyBytes = filter(RSAsecret.encrypt(aesKeyBytes.buffer))

// step5-end

const timestamp = Math.floor(Date.now() / 1000)
